﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using FacebookApp;
using System.Drawing;
using System.IO;
using System.Text;
using System.Drawing.Drawing2D;

public partial class Pages_ForgotPassword : System.Web.UI.Page
{
    int rrandom = 0;
    int grandom = 0;
    int brandom = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            RefreshCaptcha();
        }
    }
    protected void btnPassword_Click(object sender, EventArgs e)
    {
        if (txtUserName.Text == "")
        {
            lberrorusername.Visible = true;            
        }
        else
            lberrorusername.Visible = false;

        if (txtCaptcha.Text == "" || !Session["captcha"].ToString().Equals(txtCaptcha.Text))
        {            
            lberrorcaptcha.Visible = true;
        }
        else
            lberrorcaptcha.Visible = false;

        if (lberrorcaptcha.Visible == true || lberrorusername.Visible == true)
            return;

        List<User> _user = UserService.User_GetByTop("", " UserName = '" + txtUserName.Text + "'", "");
        if (_user != null && _user.Count != 0)
        {
            string email = _user[0].Email.ToString();
            string randomString = FunctionClass.RandomString(6);
            string detail = "Bạn đã quên mật khẩu. Ban quản trị gởi mật khẩu mới cho bạn. \nTiến hành đổi mật khẩu sau khi nhận mail này để đảm bảo an toàn cho bạn.";
            detail += "\nMật khẩu mới: " + randomString;
            if (SendMail.Mail(email, detail, "[eBookStore - Facebook] Mật khẩu mới") == 1)
            {
                randomString = FunctionClass.encryptData(randomString);
                UserService.User_ChangePass(_user[0].Id.ToString(), randomString);
                pncomfirm.Visible = true;
                pnForgotPass.Visible = false;
                pnError.Visible = false;
            }
            else
            {
                lberror.Text = "Xảy ra lỗi trong quá trình gởi email.";
                pnError.Visible = true;
            }
        }
        else
        {
            lberror.Text = "Lỗi tên đăng nhập không tồn tại.";
            pnError.Visible = true;
        }
    }

    protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
    {
        RefreshCaptcha();
    }

    private void RefreshCaptcha()
    {
        DirectoryInfo dr = new DirectoryInfo(Server.MapPath("~/Data/App/Captcha/"));
        foreach (FileInfo f in dr.GetFiles())
        {
            f.Delete();
        }
        captchaImage.ImageUrl = CreateCaptcha();
    }
    public string CreateCaptcha()
    {
        const byte LENGTH = 5;
        // chiều dài chuỗi để lấy các kí tự sẽ sử dụng cho captcha
        const string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        using (Bitmap bmp = new Bitmap(120, 35))
        {
            using (Graphics g = Graphics.FromImage(bmp))
            {
                // Tạo nền cho ảnh dạng sóng
                HatchBrush brush = new HatchBrush(HatchStyle.Percent80, Color.White, Color.Tan);
                g.FillRegion(brush, g.Clip);
                // Lưu chuỗi captcha trong quá trình tạo
                StringBuilder strCaptcha = new StringBuilder();
                Random rand = new Random();
                float locationX = 3;
                for (int i = 0; i < LENGTH; i++)
                {
                    // Lấy kí tự ngẫu nhiên từ mảng chars
                    SolidBrush brushes = new SolidBrush(GetRandomColor());
                    string str = chars[rand.Next(chars.Length)].ToString();
                    strCaptcha.Append(str);
                    // Tạo font với tên font ngẫu nhiên chọn từ mảng fonts
                    Font font = new Font("Times New Roman", new Random().Next(14, 17), FontStyle.Bold);
                    // Lấy kích thước của kí tự
                    SizeF size = g.MeasureString(str, font);
                    // Vẽ kí tự đó ra ảnh tại vị trí tăng dần theo i, vị trí top ngẫu nhiên
                    g.DrawString(str, font, brushes, locationX, rand.Next(2, 10));
                    font.Dispose();
                    //định location X
                    locationX += size.Width + i;
                }
                // Lưu captcha vào session
                Session["captcha"] = strCaptcha.ToString();
                // Ghi ảnh trực tiếp ra luồng xuất theo định dạng gif
                //Response.ContentType = "image/GIF";4
                int numRandom = new Random().Next(1, 3000);
                string imgFile = "captcha" + numRandom + ".jpg";
                string directoryCaptcha = "~/Data/App/Captcha/";
                // Kiểm tra thư mục đã tồn tại
                if (!Directory.Exists(Server.MapPath(directoryCaptcha)))
                {
                    Directory.CreateDirectory(Server.MapPath(directoryCaptcha));
                }
                //lấy thông tin thư mục
                DirectoryInfo direcInfo = new DirectoryInfo(Server.MapPath(directoryCaptcha));
                foreach (FileInfo file in direcInfo.GetFiles(".jpg"))
                {
                    try
                    {
                        //Xóa tất cả các tập tin hình trong thư mục hiện tại
                        file.Delete();
                    }
                    catch { }
                }
                bmp.Save(Server.MapPath(directoryCaptcha + imgFile));
                return directoryCaptcha + imgFile;
            }
        }
    }

    private Color GetRandomColor()
    {
        Random rnd = new Random();
        int ri = rnd.Next(255);
        if (ri == rrandom)
        {
            ri = rnd.Next(255);
        }
        else
        {
            rrandom = ri;
        }
        int gi = rnd.Next(255);
        if (gi == grandom)
        {
            gi = rnd.Next(255);
        }
        else
        {
            grandom = gi;
        }
        int bi = rnd.Next(255);
        if (bi == brandom)
        {
            bi = rnd.Next(255);
        }
        else
        {
            brandom = bi;
        }
        byte r = Convert.ToByte(ri);
        byte g = Convert.ToByte(gi);
        byte b = Convert.ToByte(bi);
        return Color.FromArgb(r, g, b);
    }
}